# 此文件实现对采集到的信号进行 256 点 FFT 变换并绘制时域和频域图
import ADC0832
import time
import numpy as np
import matplotlib.pyplot as plt

# 初始化 ADC0832 模块
def init():
    ADC0832.setup()
    
# 主循环，进行信号采样和 FFT 变换
def loop():
    # 取 256 点数据做 FFT
    fft_size=256       # 256 点 FFT
    sampl_freq=3700  # 采样频率

    # 进行信号采样，共 256 点数据
    n=0
    y=[]
    t=time.time()
    while n<fft_size:
        digitalVal=ADC0832.getResult()
        n=n+1
        y.append(3.3*float(digitalVal)/255) # 将数字量转换为实际电压值
    t=time.time()-t

    # 计算实际采样频率
    sampl_freq = fft_size/t 

    # 对有限长实信号做快速傅立叶变换
    y_fft=np.fft.rfft(y)    

    # 只绘制幅度谱
    y_fft_ampl=np.abs(y_fft)    

    x=np.linspace(0,t,fft_size)

    # 计算频谱上每一点的真实频率
    freq=np.linspace(0,sampl_freq/2,int(fft_size/2+1))

    # 绘制时域和频域图
    plt.figure(figsize=(8,4))
    plt.subplot(211)
    plt.plot(x,y)
    plt.xlabel(u"t(s)")
    plt.title(u"Time domain")
    plt.subplot(212)
    plt.plot(freq,y_fft_ampl)
    plt.xlabel(u"freq(Hz)")
    plt.title(u"Frequency domain")
    plt.subplots_adjust(hspace=0.4)
    plt.show()

if __name__=='__main__':
    init()            # 初始化 ADC0832 模块
    loop()            # 进行信号采样和 FFT 变换
    ADC0832.destroy() # 释放GPIO端口
    print("The end!") # 程序终止